#include "napi/native_api.h"
#include "audio_opensles_test.h"
#include<cstring>
#include<cstdio>
#include "napi/napi_utils.h"

#ifdef __cplusplus
extern "C" {
#endif
#include "ohoslog/ohos_log.h"

static napi_value Add(napi_env env, napi_callback_info info)
{
    size_t argc = 1;
    napi_value args[1] = { nullptr };
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    //    std::string url;
    //    NapiUtil::JsValueToString(env, args[0], 1024, url);
    napi_call_function(env, nullptr, args[0], 1, nullptr, nullptr);
    return nullptr;

}

static napi_value call_js_fn(napi_env env, napi_callback_info info) {
    size_t argc = 2;     // 入参个数
    napi_value args[2];  // 入参数组
    napi_get_cb_info(env, info, &argc, args, NULL, NULL);

    napi_value json = args[0]; // 第一个参数 json 对象
    napi_value name_key, name; // json 中的 name
    napi_value age_key, age;   // json 中的 age
    napi_value cb = args[1];   // 第二个参数 function 回调

    // 将 C 语言的 char* name、age 变成 napi 的 string
    // 用于 napi 提供的一些列 API，如 napi_get_property
    napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &name_key);
    napi_create_string_utf8(env, "age", NAPI_AUTO_LENGTH, &age_key);

    napi_get_property(env, json, name_key, &name); // 取出 json 中的 name
    napi_get_property(env, json, age_key, &age);   // 取出 json 中的 age

    napi_value argv[] = { name, age }; // 调用 js 回调时候传入的参数
    napi_value global;
    napi_get_global(env, &global);   // 获取当前执行 js 的 global 对象
    napi_value result;

    napi_call_function( // 调用 js 回调函数
            env,    // 当前程序执行上下文
            global, // js 回调的 this 对象，在 js 回调中可以验证: console.log(this === global); // true
            cb,     // js 回调函数句柄
            2,      // js 回调函数接受参数个数
            argv,   // js 回调函数参数数组
            &result // js 回调函数中如果有 retrun，将会被 result 接受到
            );


    return nullptr;
}

static napi_value PlayAudio(napi_env env, napi_callback_info info)
{
        playwav();
    return nullptr;
}

static napi_value PlayPause(napi_env env, napi_callback_info info)
{
    PlayerPause();
    return nullptr;
}

static napi_value ContinuePlay(napi_env env, napi_callback_info info)
{
    continuePlay();
    return nullptr;
}

static napi_value StopPlay(napi_env env, napi_callback_info info)
{
    stopPlay_();
    return nullptr;
}

EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
    napi_property_descriptor desc[] = { { "bbdd", nullptr, call_js_fn, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "playAudio", nullptr, PlayAudio, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "ContinuePlay", nullptr, ContinuePlay, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "StopPlay", nullptr, StopPlay, nullptr, nullptr, nullptr, napi_default, nullptr },
    { "PlayPause", nullptr, PlayPause, nullptr, nullptr, nullptr, napi_default, nullptr } };
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
    return exports;
}
EXTERN_C_END

static napi_module
demoModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "libhello",
.nm_priv = ((void *)0),
.reserved = {
0 },
};

extern "C" __attribute__((constructor)) void RegisterModule(void)
{
napi_module_register(& demoModule);
}
#ifdef __cplusplus

}
#endif